import axios from 'axios'
import qs from 'qs'
import NProgress from 'nprogress'
import router from '@/router/router'
import store from '@/store/index'
import { Notification } from 'element-ui'
import oPrivate from '../../private-config'

// API 服务器地址
const publicPath = oPrivate.publicPath

// axios 默认配置
// axios.defaults.baseURL = 'http://yuanben.lubanzaixian.com'
axios.defaults.timeout = 60000
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'

// 请求时的拦截器
axios.interceptors.request.use(config => {
  // 这里可以加一些动作, 比如来个进度条开始动作
  NProgress.start()
  return config
}, error => {
  return Promise.reject(error)
})

// 请求完成后的拦截器
axios.interceptors.response.use(response => response, error => {
  // 这里我们把错误信息捕捉, 后面就不需要写 catch 了
  return Promise.resolve(error.response || error)
})

const handleResponseError = function(response) {
  const paramType = Object.prototype.toString.call(response)
  if (paramType !== '[object Object]') {
    let code = 50000
    let data = '系统繁忙'
    if (paramType === '[object String]') {
      code = 50001
      data = response
    } else if (paramType === '[object Error]') {
      if (response.code === 'ECONNABORTED') {
        code = 50003
        data = '请求超时'
      } else {
        code = 50002
        data = response.message
      }
    }
    return { code, data }
  }
  return false
}

function checkStatus(response) {
  NProgress.done()
  const errorData = handleResponseError(response)
  if (errorData) return errorData
  // 如果 http 状态码正常, 则直接返回数据
  if (response.status === 200 || response.status === 304) {
    const { code, data, msg } = response.data
    // console.log(code, data, msg)
    if (code === 0) {
      return {
        code,
        data
      }
    }
    return {
      code,
      data: msg
    }
  }
  // 异常状态下, 把错误信息返回去
  return {
    code: response.status,
    data: response.statusText
  }
}

// 处理来自后端的错误
function checkCode(res, type) {
  if (type !== 'noProcssing') {
    // 需要处理
    if (res.code === 10001 && !oPrivate.dev.notValidated) {
      Notification.error('重新登录')
      store.commit('updateLoginStatus', false)
      router.replace({ name: 'login' })
    } else if (res.code !== 0) {
      // 默认 MessageBox 显示错误信息
      const err = `${res.data}. `
      Notification.error(err)
    }
  }
  return res
}

/**
 * 封装好的 post 和 get 方法
 * @params {Object} opts  -- 配置参数
 * @params {String} opts.url -- 请求路径
 * @params {String} opts.errType -- 处理错误方式
 * @params {Object} data  -- 请求所带的参数
 * @returns {Promise} -- 返回一个 promose 对象
 */

export default {
  post(opts, data) {
    return axios({
      method: 'post',
      url: publicPath + opts.url,
      data: qs.stringify(data)
    }).then(checkStatus).then(res => {
      return checkCode(res, opts.errType)
    })
  },
  formData(url, params, opts = {}) {
    return axios({
      method: 'post',
      url: publicPath + url,
      data: params,
      headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Content-Type': 'multipart/form-data'
      }
    }).then(checkStatus).then(res => {
      return checkCode(res, opts.errType)
    })
  },
  get(opts, params) {
    return axios({
      method: 'get',
      url: publicPath + opts.url,
      params
    }).then(checkStatus).then(res => {
      return checkCode(res, opts.errType)
    })
  }
}
